﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;

namespace TowerDefence
{
    public class WaveManager : MonoBehaviour
    {
        GameManager gameManager;  // 游戏管理器实例
        SceneFader fader;         // 场景淡入淡出效果实例
        Arrows arrow;              // 箭头实例

        [Header("Wave Information")]
        public static int EnemiesAlive = 0;  // 敌人存活数量（静态变量，可以通过类名访问）
        public WaveSpawner[] waveSpawners;    // 波次生成器数组
        public Wave[] waves;                   // 波次数组
        [Space]
        public float countdown = 10;          // 波次倒计时
        public float timeBetweenWaves = 5;    // 波次间隔时间
        [HideInInspector]
        public bool beginDownTimer;           // 开始倒计时标志
        [HideInInspector]
        public int waveIndex = 0;             // 当前波次索引
        [Space]
        public TextMeshProUGUI waveNumberText; // 波次文本显示
        public GameObject waveButton;          // 波次按钮

        // Boolean
        bool displayIncomingEnemies = true;    // 显示即将到来的敌人标志

        void Start()
        {
            if (gameManager == null)
                gameManager = FindObjectOfType<GameManager>();  // 查找并获取游戏管理器实例
            if (waveButton == null)
                Debug.LogError("Missing waveButton reference!"); // 输出错误信息，提示缺少波次按钮的引用
            fader = FindObjectOfType<SceneFader>();             // 查找并获取场景淡入淡出效果实例
            arrow = Arrows.instance;                            // 获取箭头实例

            Button waveBut = waveButton.gameObject.GetComponent<Button>();
            waveBut.onClick.AddListener(StartWaveButton);       // 为波次按钮添加点击事件监听器

            EnemiesAlive = 0;                                   // 初始化敌人存活数量
            waveNumberText.text = PlayerStats.Rounds.ToString() + " / " + waves.Length;  // 初始化波次文本显示
            GameManager.BeginGame = false;                       // 将游戏开始标志设为false
            displayIncomingEnemies = true;                       // 初始化显示即将到来的敌人标志
        }

        public void Update()
        {
            Wave wave = waves[waveIndex]; // 获取当前波次信息

            // 在游戏开始前确保波次生成器显示即将到来的敌人
            if (displayIncomingEnemies)
            {
                displayIncomingEnemies = false;
                DisplayEnemiesOnWaveSpawner(wave);
            }

            if (GameManager.BeginGame == false)
                return;

            if (GameManager.IsPaused)
            {
                waveButton.SetActive(false); // 如果游戏暂停，隐藏波次按钮
                return;
            }

            BeginDownTimerForWaves(wave); // 开始波次倒计时

            // 如果还有敌人存活或者当前波次尚未完全部署完毕且倒计时已开始，或者游戏结束，则退出Update
            if (EnemiesAlive > 0 || (AllEnemiesDeployedInWave(wave) == false && beginDownTimer) || GameManager.GameIsOver)
                return;

            // 如果波次按钮不在激活状态，则激活它
            if (!waveButton.activeInHierarchy)
                waveButton.SetActive(true);

            // 如果倒计时小于等于0，则开始新的波次
            if (countdown <= 0)
            {
                StartWave(wave);
                return;
            }

            // 冷却处理
            if (AllEnemiesDeployedInWave(wave))
            {
                beginDownTimer = false;
                waveIndex++;
            }

            DisplayEnemiesOnWaveSpawner(wave);

            countdown -= Time.deltaTime;
            countdown = Mathf.Clamp(countdown, 0f, Mathf.Infinity);

            // 玩家完成了关卡
            LevelCompleted();
        }

        // 在波次生成器上显示即将到来的敌人图标
        private void DisplayEnemiesOnWaveSpawner(Wave wave)
        {
            for (int i = 0; i < wave.enemyInfo.Length; i++)
            {
                for (int j = 0; j < waveSpawners.Length; j++)
                {
                    if (waveSpawners[j].route == wave.enemyInfo[i].route)
                        waveSpawners[j].DisplayEnemyIcon(wave.enemyInfo[i].enemyType);
                }
            }
        }


        // 开始为波次启动倒计时
        private void BeginDownTimerForWaves(Wave wave)
        {
            if (beginDownTimer)
            {
                // 减少每个敌人的倒计时
                for (int i = 0; i < wave.enemyInfo.Length; i++)
                {
                    wave.enemyInfo[i].downTime -= Time.deltaTime;
                }
            }
        }

        // 判断关卡是否完成
        private void LevelCompleted()
        {
            if (waveIndex.Equals(waves.Length) && EnemiesAlive <= 0)
            {
                // 标记关卡已完成，并禁用当前脚本
                gameManager.LevelCompleted();
                enabled = false;
            }
        }

        // 开始一个波次
        private void StartWave(Wave wave)
        {
            // 开始波次
            PlayerStats.Rounds++;
            waveNumberText.text = PlayerStats.Rounds.ToString() + " / " + waves.Length;
            waveButton.SetActive(false);
            beginDownTimer = true;

            // 统计敌人总数
            for (int i = 0; i < wave.enemyInfo.Length; i++)
            {
                EnemiesAlive += wave.enemyInfo[i].count;
            }

            // 关闭波次生成器上的敌人图标显示
            for (int i = 0; i < waveSpawners.Length; i++)
                waveSpawners[i].CloseEnemyIcons();

            countdown = timeBetweenWaves; // 设置倒计时为波次之间的时间间隔
        }

        // 按钮触发开始波次的方法
        public void StartWaveButton()
        {
            if (Time.timeScale.Equals(0))
                return;

            // 开始游戏
            GameManager.BeginGame = true;

            // 游戏开始后停止箭头指示
            for (int i = 0; i < arrow.arrowScript.Count; i++)
            {
                arrow.arrowScript[i].stop = true;
            }

            countdown = 0; // 重置倒计时
            waveButton.SetActive(false); // 隐藏波次按钮
        }

        // 检查当前波次中的所有敌人是否已部署
        private bool AllEnemiesDeployedInWave(Wave wave)
        {
            for (int i = 0; i < wave.enemyInfo.Length; i++)
            {
                if (wave.enemyInfo[i].waveHasBegun == false)
                {
                    return false;
                }
            }

            return true;
        }

    }
}
